﻿using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;

namespace MyRabbitMQ.Server
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectProduce();

            Console.ReadLine();
        }

        static void DirectProduce()
        {
            #region 已注释

            //var factory = new ConnectionFactory();
            //factory.HostName = "192.168.3.101";//主机名，Rabbit会拿这个IP生成一个endpoint，这个很熟悉吧，就是socket绑定的那个终结点。
            //factory.Port = 31802;
            //factory.UserName = "admin";//默认用户名,用户可以在服务端自定义创建，有相关命令行
            //factory.Password = "password";//默认密码

            //using (var connection = factory.CreateConnection())//连接服务器，即正在创建终结点。
            //{
            //    //创建一个通道，这个就是Rabbit自己定义的规则了，如果自己写消息队列，这个就可以开脑洞设计了
            //    //这里Rabbit的玩法就是一个通道channel下包含多个队列Queue
            //    using (var channel = connection.CreateModel())
            //    {
            //        foreach (var userNotification in userNotifications)
            //        {
            //            if (userNotification.Notification.Data is MessageNotificationData data)
            //            {
            //                channel.QueueDeclare("kibaQueue", false, false, false, null);//创建一个名称为kibaqueue的消息队列
            //                var properties = channel.CreateBasicProperties();
            //                properties.DeliveryMode = 1;
            //                string message = data.Content; //传递的消息内容
            //                channel.BasicPublish("", "kibaQueue", properties, Encoding.UTF8.GetBytes(message)); //生产消息
            //            }
            //        }
            //    }
            //}

            #endregion

            var factory = new ConnectionFactory();
            factory.HostName = "192.168.3.101";//主机名，Rabbit会拿这个IP生成一个endpoint，这个很熟悉吧，就是socket绑定的那个终结点。
            factory.Port = 31802;
            factory.UserName = "admin";//默认用户名,用户可以在服务端自定义创建，有相关命令行
            factory.Password = "password";//默认密码

            //创建连接
            using (var connection = factory.CreateConnection())
            {
                //创建信道
                using (var channel = connection.CreateModel())
                {
                    //声明交换机对象,fanout类型
                    string exchangeName = "direct_exchange";
                    channel.ExchangeDeclare(exchangeName, ExchangeType.Direct);

                    ////创建队列
                    //string queueName1 = "queue_name_test";
                    //channel.QueueDeclare(queueName1, true, false, false);

                    ////把创建的队列绑定交换机,direct_errorlog队列只绑定routingKey:error
                    //channel.QueueBind(queue: queueName1, exchange: exchangeName, routingKey: "message");

                    var properties = channel.CreateBasicProperties();
                    properties.Persistent = true; //消息持久化
                    // 模拟生产
                    while(true)
                    {
                        ////向交换机写10条错误日志
                        //for (int i = 0; i < 10; i++)
                        //{
                        //    string message = $"RabbitMQ Direct {i + 1} error Message";
                        //    var body = Encoding.UTF8.GetBytes(message);
                        //    channel.BasicPublish(exchangeName, "message", properties, body);
                        //    Console.WriteLine($"发送Direct消息error:{message}");
                        //}

                        //Thread.Sleep(3000);

                        //向交换机写10条错误日志
                        string message = $"RabbitMQ Direct error Message";
                        var body = Encoding.UTF8.GetBytes(message);
                        channel.BasicPublish(exchangeName, "message", properties, body);
                        Console.WriteLine($"发送Direct消息error:{message}");

                        Thread.Sleep(1000);
                    }
                }
            }
        }
    }
}
